/*
 * WketorD3D.java
 *
 * Created on 30 listopad 2007, 15:44
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package pla.bib;

import odc.Odcinek;

/**
 * klasa zawiera definice wektora 3D na doublach
 * @author arkadiusz
 */
public class WektorD3D {
  /**
   * wsp. x
   */
  double x;
  /**
   * wsp. y
   */
  double y;
  /**
   * wsp. z
   */
  double z;
  /** Creates a new instance of WketorD3D */
  public WektorD3D() {
    this.x = 0;
    this.y = 0;
    this.z = 0;
  }
  /**
   * Wektror z trzech wspolrzendnych.
   * @param x wspolrzendna <b>x</b>
   * @param y wspolrzendna <b>y</b>
   * @param z wspolrzendna <b>z</b>
   */
  
  public WektorD3D(double x, double y, double z) {
    this.x = x;
    this.y = y;
    this.z = z;
  }
  /**
   * Tworzy wektor z tablicy 3 elementow
   * @param v tablica trzy elementowa [x,y,z]
   */
  public WektorD3D(double[] v) {
    this.x = v[0];
    this.y = v[1];
    this.z = v[2];
  }
  /**
   * generuje z odcinaka (odc.Ocinek) obiekt wektor.
   * @param o Odcinek na podstawie ktorego generowany jset wektor
   */
  public WektorD3D(Odcinek o){
    this.x = o.x2 - o.x1;
    this.y = o.y2 - o.y1;
    this.z = o.z2 - o.z1;
  }
  /**
   * oblicza norme
   * @return zwraca wartosc normy.
   */
  public double normo(){
    return Math.sqrt(this.x*this.x + this.y*this.y + this.z*this.z);
  }
  /**
   * normuje werktor.
   */
  public WektorD3D normu(){
    double n = this.normo();
    this.x /= n;
    this.y /= n;
    this.z /= n;
    return this;
  }
/*
  public WektorD3D razyW(WektorD3D a){  }
  public double razyS(WektorD3D a){  }
 */
  /**
   * Konwertuje wektor do tablicy 3 elementow
   * @return Tablica [x,y,z]
   */
  public Double[] doTablicy(){
    return new Double[]{this.x,this.y,this.z};
  }
  public String toString(){
    return "["+this.x + ";" + this.y + ";" + this.z + "] ";
  }
  /**
   * Oblicza iloczyn skalarny. v.razyW(a) == v * a
   * @param a wektor przez ktory mnorzymy.
   * @return Liczbe typu double - wynik mnozenia skalarnego.
   */
  public double razySD(WektorD3D v) {
    return this.x *v.x + this.y * v.y + this.z * v.z;
  }
  
  
  /**
   * oblicza iloczyn wektorowy. kolejnosc zgodna z intuicja w.razyW(v) == w * v
   * @param a wektor przez ktory mnozymy
   * @return wynik mnorzenia jako obiekt WketorD3D
   */
  public WektorD3D razyWD(WektorD3D v) {
    double x = this.y * v.z - this.z * v.y;
    double y = this.z * v.x - this.x * v.z;
    double z = this.x * v.y - this.y * v.x;
    
    return new WektorD3D(
      this.y * v.z - this.z * v.y,
      this.z * v.x - this.x * v.z,
      this.x * v.y - this.y * v.x
      );
    
  }
}

  /*
   public Wektor<Double> razyW(Wektor<Double> v) {
     Wektor<Double> w = new WektorD3D(
      this.y * v.z - this.z * v.y,
      this.z * v.x - this.x * v.z,
      this.x * v.y - this.y * v.x
      );
     return w;
  }
   
  public Double razyS(Wektor<Double> v) {
       return this.x *v.x + this.y * v.y + this.z * v.z;
  }
   
   */

